package utils

import (
	"encoding/json"
	"os"
	"zinx/ziface"
)

// GlobalObj 存储一切Zinx框架的全局参数，供其他模块使用(参数可以通过用户的.json文件进行配置)
type GlobalObj struct {
	//全局Server
	TcpServer ziface.IServer
	//当前服务器监听的IP
	Host string
	//当前服务器监听的端口号
	TcpPort int
	//当前服务器的名称
	Name string
	//当前Zinx的版本号
	Version string
	//当前服务器主机允许的最大连接数
	MaxConn int
	//当前Zinx框架数据包的最大值
	MaxPackageSize uint32
	//当前WorkerPool中Worker的最大数量
	WorkerPoolSize uint32
	//Worker允许的上限值
	MaxWorkerPoolSize uint32
	//一个工作队列里面的最大任务数
	MaxTaskQueueSize uint32
}

// GlobalObject 全局的GlobalObj对象
var GlobalObject *GlobalObj

// Reload 从conf/zinx.json加载用户自定义参数的方法
func (g *GlobalObj) Reload() {
	data, err := os.ReadFile("conf/zinx.json")
	if err != nil {
		panic(err)
	}
	//将json文件数据解析到struct中
	err = json.Unmarshal(data, &GlobalObject)
	if err != nil {
		panic(err)
	}
}

// 全局init方法初始化GlobalObj对象
func init() {
	GlobalObject = &GlobalObj{
		Host:              "0.0.0.0",
		TcpPort:           8999,
		Name:              "ZinxServerApp",
		Version:           "V0.4",
		MaxConn:           1000,
		MaxPackageSize:    4096,
		WorkerPoolSize:    10,
		MaxWorkerPoolSize: 1024,
		MaxTaskQueueSize:  1024,
	}
	//应该尝试从conf/zinx.json去加载一些用户自定义的参数
	GlobalObject.Reload()
}
